/* 
 * File:   Server_thread_crear_partida.cpp
 * Author: jaschu
 * 
 * Created on 30 de mayo de 2014, 18:13
 */

#include <vector>
#include <iostream>
#include <chrono>
#include <thread>
#include "server_thread_crear_partida.h"
#include "server_thread_partida.h"
#include "server_Partida.h"
#include "common_Mutex.h"

using std::cout;
using std::endl;

Server_thread_crear_partida::Server_thread_crear_partida() {
}

Server_thread_crear_partida::Server_thread_crear_partida(const Server_thread_crear_partida& orig) {
}

Server_thread_crear_partida::~Server_thread_crear_partida() {
}

void Server_thread_crear_partida::serverDejoDeCorrer() {
    *serverCorre = false;
}

void Server_thread_crear_partida::ejecutar() {
    while (*serverCorre) {
        std::this_thread::sleep_for(std::chrono::milliseconds((800)));
        this->mutex->lock();
        if ((*partidasPendientes).size() > 0) {
            for (unsigned int i = 0; i < (*partidasPendientes).size(); i++) {
                if ((*partidasPendientes)[i]->fueCancelada()) {
                    partidasPendientes->erase(partidasPendientes->begin() + i);
                    //i--;
                    continue;
                }
                log.estadoPartida((*partidasPendientes)[i]);
                if (((*partidasPendientes)[i])->empezarActivado()) {
                    //creo hilo de nueva partida y lo agrego a la lista.
                    Server_thread_partida* threadPartida = new Server_thread_partida();
                    lista_threads.push_back(threadPartida);
                    threadPartida->setFlagCorrer(serverCorre);
                    //le asigno la partida al hilo.
                    threadPartida->setPartida((*partidasPendientes)[i]);
                    //lanzo el hilo de nueva partida
                    threadPartida->iniciar();
                    //elimino partida de la lista.
                    partidasPendientes->erase(partidasPendientes->begin() + i);
                }
            }
        }
        this->mutex->unlock();
    }
    for (unsigned int j = 0; j < lista_threads.size(); j++) {
        lista_threads[j]->join();
        delete lista_threads[j];
    }
}

void Server_thread_crear_partida::setPartidasPendientes(vector<Partida*> *pendientes) {
    partidasPendientes = pendientes;
}

void Server_thread_crear_partida::setFlagCorrer(bool* correr) {
    serverCorre = correr;
}

void Server_thread_crear_partida::setMutexLista(Mutex* mutex) {
    this->mutex = mutex;
}